package com.liqw.core;

import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;

import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 课程爬取类（处理课程列表获取、章节学习、进度跟踪）
 */
@Slf4j
public class CourseCrawler {
    private final WebDriver driver;

    public CourseCrawler(WebDriver driver) {
        this.driver = driver;
    }

    /**
     * 爬取课程列表并学习未完成课程
     */
    public void crawlAndStudyCourses() {
        // 等待课程容器加载
        WebElement courseContainer = WebDriverUtils.waitForElementVisible(driver,
                By.xpath(SelectorConstants.XPATH_LIVE_COURSE_MENU));
        if (courseContainer == null) {
            log.error("未找到课程容器，无法爬取课程");
            return;
        }

        // 获取所有课程项
        List<WebElement> courseItems = courseContainer.findElements(By.cssSelector(SelectorConstants.CSS_COURSE_ITEM));
        log.info("共发现 {} 门课程", courseItems.size());

        for (WebElement courseItem : courseItems) {
            try {
                // 提取课程信息
                WebElement titleElement =
                        courseItem.findElement(By.cssSelector(SelectorConstants.CSS_COURSE_TITLE));
                WebElement progressElement = courseItem
                        .findElement(By.cssSelector(SelectorConstants.CSS_COURSE_PROGRESS));
                WebElement studyBtn = courseItem
                        .findElement(By.cssSelector(SelectorConstants.CSS_COURSE_STUDY_BTN));

                String courseName = titleElement.getText();
                String progressText = progressElement.getText();
                log.info("课程名称: {}", courseName);
                log.info("学习进度: {}", progressText);

                // 解析进度（只处理未完成课程）
                Integer progress = parseProgress(progressText);
                if (progress == null || progress >= 100) {
                    log.info("课程已完成，跳过学习");
                    continue;
                }

                // 学习课程（点击学习按钮并处理章节）
                studyCourse(courseName, studyBtn);
            } catch (Exception e) {
                log.error("处理课程时异常", e);
            }
        }
    }

    /**
     * 解析学习进度（提取进度文本中的数字）
     */
    private Integer parseProgress(String progressText) {
        if (progressText == null) {
            return null;
        }
        Matcher matcher = Pattern.compile("\\d+").matcher(progressText);
        return matcher.find() ? Integer.parseInt(matcher.group()) : null;
    }

    /**
     * 学习单门课程（打开课程页并处理章节）
     */
    private void studyCourse(String courseName, WebElement studyBtn) {
        // 点击学习按钮并切换到新窗口
        String originalHandle = driver.getWindowHandle();
        Set<String> originalHandles = driver.getWindowHandles();
        boolean clickSuccess = WebDriverUtils.clickElement(driver, studyBtn);
        if (!clickSuccess) {
            log.error("课程 [{}] 学习按钮点击失败", courseName);
            return;
        }

        // 切换到课程详情页窗口
        String courseWindowHandle = WebDriverUtils.switchToNewWindow(originalHandles, driver);
        if (courseWindowHandle == null) {
            log.error("课程 [{}] 未打开新窗口，无法学习", courseName);
            return;
        }

        try {
            // 等待课程章节加载
            WebElement sectionContainer = WebDriverUtils.waitForElementVisible(driver,
                    By.cssSelector(SelectorConstants.CSS_SECTION_ITEM));
            if (sectionContainer == null) {
                log.error("课程 [{}] 未找到章节容器", courseName);
                return;
            }

            // 处理所有章节
            List<WebElement> sections = driver.findElements(By.cssSelector(SelectorConstants.CSS_SECTION_ITEM));
            log.info("课程 [{}] 共 {} 个章节", courseName, sections.size());

            for (WebElement section : sections) {
                String sectionName = section.getText().trim();
                log.info("开始学习章节: {}", sectionName);
                // 点击展开章节
                WebDriverUtils.clickElement(driver, section);

                // 学习章节内未完成的活动
                studySectionActivities(section);
            }
        } finally {
            // 关闭课程窗口并切回原窗口
            WebDriverUtils.closeWindowAndSwitchBack(driver, courseWindowHandle, originalHandle);
        }
    }

    /**
     * 学习章节内的活动（如视频、作业等）
     */
    private void studySectionActivities(WebElement section) {
        List<WebElement> activities = section.findElements(By.cssSelector(SelectorConstants.CSS_ACTIVITY_ITEM));
        if (activities.isEmpty()) {
            log.info("当前章节无活动项");
            return;
        }

        for (WebElement activity : activities) {
            // 检查活动是否已完成（通过完成图标判断）
            List<WebElement> elements = activity
                    .findElements(By.cssSelector(SelectorConstants.CSS_ACTIVITY_FINISH_ICON));
            if (elements.size() > 0) {
                // 元素存在，获取第一个匹配的元素并操作
                WebElement finishIcon = elements.get(0);
                if (finishIcon != null && finishIcon.getAttribute("src").endsWith("sectionfinish.png")) {
                    log.info("活动 [{}] 已完成，跳过", activity.getText().trim());
                    continue;
                }
            }

            if (!existsNotCompleteTag(activity)) {
                log.info("活动 [{}] 不存在未完成标志，跳过", activity.getText().trim());
                continue;
            }
            ;

            // 学习未完成活动
            studyActivity(activity);
        }
    }

    private static boolean existsNotCompleteTag(WebElement activity) {
        // 查找元素（使用findElements，返回列表）
        List<WebElement> elements = activity
                .findElements(By.cssSelector(SelectorConstants.CSS_ACTIVITY_ITEM_BUTTON_ACTION));
        if (elements.size() > 0) {
            log.info("活动 [{}] 存在未完成标志1", activity.getText().trim());
            return true;
        }

        elements = activity.findElements(By.cssSelector(SelectorConstants.CSS_ACTIVITY_ITEM_SPAN_ACTION));
        if (elements.size() > 0) {
            log.info("活动 [{}] 存在未完成标志2", activity.getText().trim());
            return true;
        }
        return false;
    }

    /**
     * 学习单个活动（如观看视频、阅读文档）
     */
    private void studyActivity(WebElement activity) {
        String activityName = activity.getText().trim();
        log.info("开始学习活动: {}", activityName);

        // 获取活动链接并打开
        String originalHandle = driver.getWindowHandle();
        WebElement linkElement = activity.findElement(By.cssSelector(SelectorConstants.CSS_ACTIVITY_LINK));
        String href = linkElement.getAttribute("href");
        if (href == null) {
            log.error("活动 [{}] 链接为空，无法学习", activityName);
            return;
        }

        Set<String> originalHandles = driver.getWindowHandles();
        // 打开活动页
        // driver.executeScript("window.open(arguments[0]);", href);
        // 模拟Ctrl+点击（在新窗口打开）
        Actions actions = new Actions(driver);
        actions.keyDown(Keys.CONTROL).click(linkElement).keyUp(Keys.CONTROL).build().perform();
        String activityWindowHandle = WebDriverUtils.switchToNewWindow(originalHandles, driver);
        if (activityWindowHandle == null) {
            log.error("活动 [{}] 未打开新窗口", activityName);
            return;
        }

        try {
            // 等待活动内容加载（假设加载完成后停留10秒学习）
            WebElement contentElement = WebDriverUtils.waitForElementVisible(driver,
                    By.cssSelector(SelectorConstants.CSS_PAGE_CONTENT));
            if (contentElement != null) {
                log.info("活动 [{}] 内容加载完成，开始学习（停留10秒）", activityName);
                Thread.sleep(10000); // 模拟学习时间（可根据实际需求调整）
            } else {
                log.error("活动 [{}] 内容未加载成功", activityName);
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            // 关闭活动窗口并切回章节页
            WebDriverUtils.closeWindowAndSwitchBack(driver, activityWindowHandle, originalHandle);
        }
    }
}